#ifndef SUDOKUWIDGET_H
#define SUDOKUWIDGET_H

#include <QWidget>
#include <map>
#include <vector>
#include <QPaintEvent>
#include <QResizeEvent>
#include "sudokucell.h"
#include "sudoku_ui_global.h"

namespace sudoku_ui
{

    class SudokuCell;
    /**
     * @brief The SudokuWidget class    数独库游戏主界面
     */
    class SUDOKU_UI_EXPORT SudokuWidget : public QWidget
    {
        Q_OBJECT
    public:
        explicit SudokuWidget(QWidget *parent = nullptr);
        virtual ~SudokuWidget();

        void setLineColor(const QColor& color);
        const QColor& lineColor() const;

        /**
         * @brief setNumbers
         * @param numbers
         */
        void setNumbers(const std::vector<std::vector<int>> & numbers);

        /**
         * @brief getNumbers
         * @return
         */
        std::vector<std::vector<int>> getNumbers() const;

        /**
         * @brief clear     清除
         */
        void clear();

        /**
         * @brief setSudokuValue
         * @param value
         */
        void setSudokuValue(int value);

        /**
         * @brief setSudokuHintValue
         * @param value
         */
        void setSudokuHintValue(int value);


    private:
        /**
         * @brief m_board           存储数独库游戏界面中的单元格
         */
        std::vector<std::vector<SudokuCell*>> m_board;

        /**
         * @brief m_ninecells       九宫格
         */
        std::map<int, std::vector<SudokuCell*>> m_ninecells;

        /**
         * @brief m_numcells        数字所对应的单元格
         */
        std::map<int, std::vector<SudokuCell*>> m_numcells;

        /**
         * @brief m_selectedCell
         */
        SudokuCell * m_selectedCell{nullptr};

        /**
         * @brief m_lineColor
         */
        QColor m_lineColor;

        /**
         * @brief isValid
         * @param row
         * @param col
         * @param value
         * @return
         */
        bool isValid(int row, int col, int value);


    private slots:
        void onSelectedCell(SudokuCell * cell);
        void onAppendCell(int num, SudokuCell * cell);
        void onRemoveCell(int num, SudokuCell * cell);

        /**
         * @brief onCheckGame   检查单元格的数值是否合法
         * @param row           行值，范围为 1-9
         * @param col           列值，范围为 1-9
         * @param num           单元格数值
         */
        void onCheckGame(int row, int col, int num);

    signals:

        // QWidget interface
    protected:
        void paintEvent(QPaintEvent *event) override;
        void resizeEvent(QResizeEvent *event) override;
    };
}


#endif // SUDOKUWIDGET_H
